package utils;

import constant.Constant;
import entry.P;
import entry.Page;

import java.util.*;

public class JiaoZhuangUtil {
    public static void main(String[] args) {
        List<List<P>> lists = getLists(24, 1, 2, 2, Constant.yin_shua_fang_shi_zheng_fan);
        List<Page> pages = getPages(24, 8);
        System.out.println(pages);
        System.out.println(lists);
    }

    public static List<Page> getPages(int page, int cr) {
        System.out.println(page + "," + cr);
        int pinshu, b, c, jichuzhi, e;
        int pageCount = page;
        page -= 4;

        List<Integer> list = new LinkedList<>();
        list.add(4);
//        if(page%4!=0&&page%2==0){
//            page -=2;
//            list.add(2);
//        }
        pinshu = cr;
        if (cr % 4 == 0) {
            jichuzhi = 4;
        } else {
            return null;
        }
        boolean arrb = false;
        int arrbnumber = 0;
        if (page % jichuzhi != 0) {
            if ((page - 2) % jichuzhi == 0) {
                arrb = true;
                arrbnumber++;
                list.add(2);
                page -= 2;
            }
        }
        do {

            b = pinshu / jichuzhi;
            c = page / pinshu;
            if (cr % b == 0) {
                for (int i = 0; i < c; i++) {
                    list.add(pinshu);
                }
                page = page - pinshu * c;
            }
            pinshu = (b - 1) * jichuzhi;

        } while (page > 0);

        boolean flag = true;
        String nums = "4";
        int count = 0;
        int min = 0;
        List<Integer> integerList = new ArrayList<>();
        for (int i = 1 + arrbnumber; i < list.size(); i++) {
            int num = list.get(i);
            if (num == cr) {
                count++;
//                integerList.add(cr);
            } else {
                integerList.add(num);
                min++;
            }
        }
        int[] arr = new int[list.size()];
        arr[0] = 4;
        if (arrb){
            if(count>1){
                arr[arr.length/2] = 2;
            }else{
                arr[arr.length - 1] = 2;
            }

        }
        int mmm = 0;
        if (count > 1) {
            if (count % 2 == 1) {
                arr[count / 2 + 1] = cr;
            }
            count /= 2;
            if (count > 0) {
                for (int i = 0; i < count; i++) {
                    arr[i + 1] = cr;
                    arr[arr.length - i - 1] = cr;
                }
            }

        } else if (count == 1) {
            mmm++;
            arr[1] = cr;
        }
        if (integerList.size() > 0) {
            int k = 0;
            for (int i = 0; i < arr.length - mmm; i++) {
                if (arr[i] == 0) {
                    arr[i] = integerList.get(k);
                    k++;
                }
            }
        }
        int sub = 0;
        for (int i = 0; i < arr.length; i++) {
            sub+=arr[i];
        }
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==0){
                arr[i]=pageCount-sub;
            }
        }
        List<Page> pageList = new ArrayList<>();
        Page page1 = new Page();
        page1.setMultiple(cr / 4);
        List<Integer> listOne = new ArrayList<>();
        listOne.add(1);
        listOne.add(2);
        listOne.add(pageCount - 1);
        listOne.add(pageCount);
        page1.setPages(listOne);
        pageList.add(page1);
        int number = 2;
        for (int i = 1; i < arr.length; i++) {
            Page pageOther = new Page();
            pageOther.setMultiple(cr / arr[i]);
            List<Integer> listOhter = new ArrayList<>();
            for (int j = 0; j < arr[i]; j++) {
                number++;
                listOhter.add(number);
            }
            pageOther.setPages(listOhter);
            pageList.add(pageOther);
        }
        System.out.println(pageList);


        return pageList;
    }

    public static List<List<P>> getLists(int page, int lian, int col, int row, String ysfs) {
        int r = row / lian;
        String zheye = Constant.zhe_ye_shi_zi_zhe;
        if (col == 4 && row == 4 && lian > 1) {
            zheye = Constant.zhe_ye_dui_zhe;
        }
        if(Constant.hengban){
            if(zheye==Constant.zhe_ye_shi_zi_zhe){
                zheye = Constant.zhe_ye_dui_zhe;
            }else{
                zheye = Constant.zhe_ye_shi_zi_zhe;
            }
        }

        int c = col;
        if (col == 4 && row == 4 && page == 4) {
            c = col / 2;
            r = row / 2;
        }
        if (ysfs.equals("自翻")) {
            if (page == 2) {
                if(row==4&&col==4){
                    return zz2p(col, row);
                }else if(col==4&&row==2){
                    return zz2p42(col, row);
                }else if(col==2&&row==2){
                    return zz2p22();
                }else if(col==2&&row==1){
                    return zz2p21();
                }
            }
            if(page==2){
                if(row==2&&col==4){
                    return zz4p42();
                }
            }
            if (c == 2 && r == 2) {
                return zz222(page, lian);
            } else if (c == 4 && r == 2) {
                return zz42(page, lian, zheye);
            } else if (c == 4 && r == 4) {
                return zz444(page, lian);
            } else if (c == 4 && r == 3) {
                //无
                InUtils.showMessage("拼数报错", "胶装暂时不支持 6P 12P 24P 折法\n以后会慢慢增加");
                return null;
            } else if (c == 4 && r == 1) {
                return zz41(page, lian);
            }
            if(col==4&&row==2&&page==4){
                return zz42();
            }
        } else {
            if (c == 2 && r == 3) {
                //无
                InUtils.showMessage("拼数报错", "胶装暂时不支持 6P 12P 24P 折法\n以后会慢慢增加");
                return null;
            } else if (c == 4 && r == 2) {
                return zf42(page, lian, zheye);
            } else if (c == 4 && r == 1) {
                return zf41(page, lian);
            } else if (c == 2 && r == 2) {
                return zf22(page, lian);
            } else if (c == 2 && r == 1) {
                return zf21(page, lian);
            }
        }
        return null;
    }

    private static List<List<P>> zz2p21() {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz42() {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        listFont.add(new P(4, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(3, 0));
        listFont.add(new P(4, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(3, 0));


        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz4p42() {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        listFont.add(new P(1, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(2, 0));

        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz2p22() {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        listFont.add(new P(1, 180));
        listFont.add(new P(1, 180));
        listFont.add(new P(2, 0));
        listFont.add(new P(2, 0));


        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz2p42(int col, int row) {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        listFont.add(new P(1, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(2, 0));

        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz2p(int col, int row) {
        List<List<P>> lists = new ArrayList<>();
        List<P> listFont = new ArrayList<>();
        for (int c = 0; c < col; c++) {
            for (int r = 0; r < row; r++) {
                if (c < col / 2) {
                    listFont.add(new P(1, 180));
                }else{
                    listFont.add(new P(2, 0));
                }
            }
        }


        lists.add(listFont);

        return lists;
    }

    /**
     * 正反印2x3
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf23(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 6) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i, 0));
                listFont.add(new P(1 + i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i - 3, 180));
                listFont.add(new P(4 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i - 4, 0));
                listFont.add(new P(5 + i, 0));
            }
            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 2, 0));
                listBack.add(new P(page - 1 - i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 3, 180));
                listBack.add(new P(page - 2 - i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 6, 0));
                listBack.add(new P(page - 5 - i, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 正反印4x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf42(int page, int lian, String zheye) {
        List<List<P>> lists = new ArrayList<>();
        if (zheye.equals(Constant.zhe_ye_shi_zi_zhe)) {
            for (int i = 0; i < page; i += 16) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(i + 16, 180));
                    listFont.add(new P(i + 13, 180));
                    listFont.add(new P(i + 4, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(8 + i, 0));
                    listFont.add(new P(i + 9, 0));
                    listFont.add(new P(i + 12, 0));
                    listFont.add(new P(i + 5, 0));
                }
                lists.add(listFont);
                List<P> listBack = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(3 + i, 180));
                    listBack.add(new P(14 + i, 180));
                    listBack.add(new P(15 + i, 180));
                    listBack.add(new P(i + 2, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(6 + i, 0));
                    listBack.add(new P(i + 11, 0));
                    listBack.add(new P(i + 10, 0));
                    listBack.add(new P(7 + i, 0));
                }
                lists.add(listBack);
            }
        } else if (zheye.equals(Constant.zhe_ye_dui_zhe)) {
            for (int i = 0; i < page; i += 16) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(i + 16, 180));
                    listFont.add(new P(i + 9, 180));
                    listFont.add(new P(i + 8, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(4 + i, 0));
                    listFont.add(new P(i + 13, 0));
                    listFont.add(new P(i + 12, 0));
                    listFont.add(new P(i + 5, 0));
                }
                lists.add(listFont);
                List<P> listBack = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(7 + i, 180));
                    listBack.add(new P(i + 10, 180));
                    listBack.add(new P(i + 15, 180));
                    listBack.add(new P(i + 2, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(6 + i, 0));
                    listBack.add(new P(i + 11, 0));
                    listBack.add(new P(i + 14, 0));
                    listBack.add(new P(3 + i, 0));
                }
                lists.add(listBack);
            }
        }

        return lists;
    }

    /**
     * 正反印4x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf41(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 8) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(i + 5, 0));
                listFont.add(new P(i + 8, 0));
                listFont.add(new P(i + 1, 0));
            }

            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(2 + i, 0));
                listBack.add(new P(i + 7, 0));
                listBack.add(new P(i + 6, 0));
                listBack.add(new P(i + 3, 0));
            }

            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 自翻4x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz41(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 4) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(3 + i, 0));
                listFont.add(new P(i + 4, 0));
                listFont.add(new P(1 + i, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x3
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz43(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 6) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(page - i - 1, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(1 + i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(3 + i, 180));
                listFont.add(new P(page - i - 2, 180));
                listFont.add(new P(page - i - 3, 180));
                listFont.add(new P(4 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(6 + i, 0));
                listFont.add(new P(page - i - 5, 0));
                listFont.add(new P(page - i - 4, 0));
                listFont.add(new P(i + 5, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x4
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz444(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 16) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(5 + i, 180));
                listFont.add(new P(page - i - 4, 180));
                listFont.add(new P(page - i - 7, 180));
                listFont.add(new P(8 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(page - i - 3, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(i + 1, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(3 + i, 180));
                listFont.add(new P(page - i - 2, 180));
                listFont.add(new P(page - i - 1, 180));
                listFont.add(new P(2 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(6 + i, 0));
                listFont.add(new P(page - i - 5, 0));
                listFont.add(new P(page - i - 6, 0));
                listFont.add(new P(i + 7, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x4
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz44(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 16) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(5 + i, 180));
                listFont.add(new P(page - i - 4, 180));
                listFont.add(new P(page - i - 7, 180));
                listFont.add(new P(8 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(page - i - 3, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(i + 1, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(3 + i, 180));
                listFont.add(new P(page - i - 2, 180));
                listFont.add(new P(page - i - 1, 180));
                listFont.add(new P(2 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(6 + i, 0));
                listFont.add(new P(page - i - 5, 0));
                listFont.add(new P(page - i - 6, 0));
                listFont.add(new P(i + 7, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz42(int page, int lian, String zheye) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 8) {
            List<P> listFont = new ArrayList<>();
            if (zheye.equals(Constant.zhe_ye_shi_zi_zhe)) {
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(i + 8, 180));
                    listFont.add(new P(i + 7, 180));
                    listFont.add(new P(2 + i, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(4 + i, 0));
                    listFont.add(new P(i + 5, 0));
                    listFont.add(new P(i + 6, 0));
                    listFont.add(new P(3 + i, 0));
                }
            } else if (zheye.equals(Constant.zhe_ye_dui_zhe)) {
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(i + 8, 180));
                    listFont.add(new P(i + 5, 180));
                    listFont.add(new P(4 + i, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(2 + i, 0));
                    listFont.add(new P(i + 7, 0));
                    listFont.add(new P(i + 6, 0));
                    listFont.add(new P(3 + i, 0));
                }
            }

            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻2x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz222(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 4) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(1 + i, 180));
                listFont.add(new P(i + 4, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(i + 3, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 正反印2x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf22(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 8) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(1 + i, 180));
                listFont.add(new P(i + 8, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(i + 5, 0));
            }

            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 7, 180));
                listBack.add(new P(i + 2, 180));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 6, 0));
                listBack.add(new P(i + 3, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 正反印2x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf21(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page; i += 4) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                //第一页
                listFont.add(new P(4 + i, 0));
                //第二页
                listFont.add(new P(1 + i, 0));
            }
            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                //第三页
                listBack.add(new P(2 + i, 0));
                //第四页
                listBack.add(new P(3 + i, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }


}
